
#ifndef UTILS_TYPE_TRAITS_H
#define UTILS_TYPE_TRAITS_H

#if defined(UTILS_ALL_BOOST)
#if !defined(UTILS_TYPE_TRAITS_BOOST) && !defined(UTILS_TYPE_TRAITS_STANDARD) 
#define UTILS_TYPE_TRAITS_BOOST
#endif
#elif defined(UTILS_ALL_STANDARD)
#if !defined(UTILS_TYPE_TRAITS_BOOST) && !defined(UTILS_TYPE_TRAITS_STANDARD) 
#define UTILS_TYPE_TRAITS_STANDARD
#endif
#endif

#if defined(UTILS_TYPE_TRAITS_BOOST)
#include <boost/type_traits.hpp>
namespace utils {
  using ::boost::add_const;
  using ::boost::add_cv;
  using ::boost::add_lvalue_reference;
  using ::boost::add_pointer;
  using ::boost::add_rvalue_reference;
  using ::boost::add_volatile;
  using ::boost::aligned_storage;
  using ::boost::alignment_of;
  using ::boost::conditional;
  using ::boost::common_type;
  using ::boost::decay;
  using ::boost::extent;
  using ::boost::false_type;
  using ::boost::has_virtual_destructor;
  using ::boost::integral_constant;
  using ::boost::is_abstract;
  using ::boost::is_arithmetic;
  using ::boost::is_array;
  using ::boost::is_base_of;
  using ::boost::is_class;
  using ::boost::is_compound;
  using ::boost::is_const;
  using ::boost::is_convertible;
  using ::boost::is_empty;
  using ::boost::is_enum;
  using ::boost::is_floating_point;
  using ::boost::is_function;
  using ::boost::is_fundamental;
  using ::boost::is_integral;
  using ::boost::is_lvalue_reference;
  using ::boost::is_member_function_pointer;
  using ::boost::is_member_object_pointer;
  using ::boost::is_member_pointer;
  using ::boost::is_object;
  using ::boost::is_pod;
  using ::boost::is_pointer;
  using ::boost::is_polymorphic;
  using ::boost::is_reference;
  using ::boost::is_rvalue_reference;
  using ::boost::is_same;
  using ::boost::is_scalar;
  using ::boost::is_signed;
  using ::boost::is_union;
  using ::boost::is_unsigned;
  using ::boost::is_void;
  using ::boost::is_volatile;
  using ::boost::make_signed;
  using ::boost::make_unsigned;
  using ::boost::rank;
  using ::boost::remove_all_extents;
  using ::boost::remove_const;
  using ::boost::remove_cv;
  using ::boost::remove_extent;
  using ::boost::remove_pointer;
  using ::boost::remove_reference;
  using ::boost::remove_volatile;
  using ::boost::true_type;
}
#elif defined(UTILS_TYPE_TRAITS_STANDARD)
#include <type_traits>
namespace utils {
  using std::add_const;
  using std::add_cv;
  using std::add_lvalue_reference;
  using std::add_pointer;
  using std::add_rvalue_reference;
  using std::add_volatile;
  using std::aligned_storage;
  using std::alignment_of;
  using std::conditional;
  using std::common_type;
  using std::decay;
  using std::extent;
  using std::false_type;
  using std::has_virtual_destructor;
  using std::integral_constant;
  using std::is_abstract;
  using std::is_arithmetic;
  using std::is_array;
  using std::is_base_of;
  using std::is_class;
  using std::is_compound;
  using std::is_const;
  using std::is_convertible;
  using std::is_empty;
  using std::is_enum;
  using std::is_floating_point;
  using std::is_function;
  using std::is_fundamental;
  using std::is_integral;
  using std::is_lvalue_reference;
  using std::is_member_function_pointer;
  using std::is_member_object_pointer;
  using std::is_member_pointer;
  using std::is_object;
  using std::is_pod;
  using std::is_pointer;
  using std::is_polymorphic;
  using std::is_reference;
  using std::is_rvalue_reference;
  using std::is_same;
  using std::is_scalar;
  using std::is_signed;
  using std::is_union;
  using std::is_unsigned;
  using std::is_void;
  using std::is_volatile;
  using std::make_signed;
  using std::make_unsigned;
  using std::rank;
  using std::remove_all_extents;
  using std::remove_const;
  using std::remove_cv;
  using std::remove_extent;
  using std::remove_pointer;
  using std::remove_reference;
  using std::remove_volatile;
  using std::true_type;
}
#endif

#endif // UTILS_TYPE_TRAITS_H

